16. 图片分类 CNN

CNN19 图片分类 CNN

和神经网络一样,我们通过首先创建一个 序列 模型来创建一个 CNN。

from keras.models import Sequential

导入几个层,包括熟悉的神经网络层,以及在这节课学习的新的层。

from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

和神经网络一样,通过使用 .add() 方法向网络中添加层级:

model = Sequential()
model.add(Conv2D(filters=16, kernel_size=2, padding='same', activation='relu', input_shape=(32, 32, 3)))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=64, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Flatten())
model.add(Dense(500, activation='relu'))
model.add(Dense(10, activation='softmax'))

该网络以三个卷积层(后面跟着最大池化层)序列开始。前 6 个层级旨在将图片像素数组输入转换为所有空间信息都丢失、仅保留图片内容信息的数组 。然后在 CNN 的第七个层级将该数组扁平化为向量。后面跟着两个密集层,旨在进一步说明图片中的内容。最后一层针对数据集中的每个对象类别都有一个条目,并具有一个 softmax 激活函数,使其返回概率。

注意 :在该视频中,你可能注意到卷积层表示为 Convolution2D ,而不是 Conv2D 。对于 Keras 2.0 来说,二者都可以,但是最好使用 Conv2D

注意事项

  • 始终向 CNN 中的 Conv2D 层添加 ReLU 激活函数。但是网络的最后层级除外, 密集 层也应该具有 ReLU 激活函数。
  • 在构建分类网络时,网络中的最后层级应该是具有 softmax 激活函数的 密集 层。最后层级的节点数量应该等于数据集中的类别总数。
  • 要开心!如果你觉得有点泄气,建议参阅 Andrej Karpathy 的 tumblr (来自外网,可能打不开),其中包含了用户提交的损失函数,对应的是本身有问题的模型。损失函数在训练期间应该是减小的,但是这些图表显示的却是非常不同的行为 :)。